<?php
defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * 消息控制器-后台
 *
 * @desc    消息控制器
 * @version 1.0.0 直接完善文档注释
 * @author  Jason
 * @date	2017年7月21日 下午3:42:31
 * 
 * @title 消息管理
 * @entry http://discovery.segway.com
 */
class Message extends MY_Manager_Controller
{
	/** @var Lib_message */
	public $lib_message = null;
	
	public function __construct()
	{
		parent::__construct();
		
		$this->load->library('lib_message');
		
		$this->set_mutable_view_var('head.title', 'Message - Management');
		$this->set_mutable_view_var('head.keywords', '');
		$this->set_mutable_view_var('head.description', '');
		
		$this->lang->load('message');
	}
	
	/**
	 * 首页 -> 列表页
	 *
	 * @return html
	 * 
	 * @command pass noneurl
	 */
	public function index()
	{
		$this->listing();
	}
	
	/**
	 * 消息列表页
	 * 
	 * @desc    listing
	 * @author  Jason
	 * @date	2017年7月21日 下午3:50:02
	 * @link    /manage/message/listing
	 */
	public function listing($page = 1, $number = 20)
	{
		$conditions = $this->lib_message->get_conditions();
		$list = $this->lib_message->get_messages_for_list($conditions, $page, $number);
		$data['list'] = $list;
		
		$this->load->view('manager/message/list', $data);
	}
	
	/**
	 * 消息模板列表页
	 *
	 * @desc    listing_template
	 * @author  Jason
	 * @date	2017年7月21日 下午3:53:31
	 * @link    /manage/message/listing_template
	 */
	public function listing_template($page = 1, $number = 20)
	{
		// MARK 这里可能需要加上 $mapping 参数
		$conditions = $this->lib_message->get_conditions();
		$list = $this->lib_message->get_templates_for_list($conditions, $page, $number);
		$data['list'] = $list;
		
		$this->load->view('manager/message/list_template', $data);
	}
	// MARK ajax 列表页
	/**
	 * 消息列表页，ajax，JSON
	 *
	 * @desc    listing
	 * @author  Jason
	 * @date	2017年7月21日 下午3:50:02
	 * @link    /manage/message/ajax_listing
	 */
	public function ajax_listing($page = 1, $number = 20)
	{
		$conditions = $this->lib_message->get_conditions();
		$list = $this->lib_message->get_messages_for_list($conditions, $page, $number);
		$data['list'] = $list;
		
		Lib_json::renderSuccess($data);
	}
	
	/**
	 * 消息模板列表页，ajax，JSON
	 *
	 * @desc    listing_template
	 * @author  Jason
	 * @date	2017年7月21日 下午3:53:31
	 * @link    /manage/message/ajax_listing_template
	 */
	public function ajax_listing_template($page = 1, $number = 20)
	{
		// MARK 这里可能需要加上 $mapping 参数
		$conditions = $this->lib_message->get_conditions();
		$list = $this->lib_message->get_templates_for_list($conditions, $page, $number);
		$data['list'] = $list;
		
		Lib_json::renderSuccess($data);
	}
	
	/**
	 * 消息模板详情 - 编辑前信息载入
	 *
	 * @desc    编辑前信息载入
	 * @method  GET
	 * @author  Jason
	 * @date	2017年7月21日 下午4:01:22
	 *
	 * @param   number $id       ID，默认为 0，代表新增一条记录
	 * 			把参数按顺序辍到 URL 之后，用 "/" 间隔
	 * @example 如果参数为 id=7
	 * 			那么URL为 /manage/message/detail_template/7
	 * 
	 * @demoParam id 7
	 */
	public function detail_template($id = 0)
	{
		$template = $this->lib_message->get_template_for_detail($id);
		if (empty($template)) {
			$template = [];
		}
		
		$data['content']['template'] = $template;
		
		$this->load->view('manager/message/detail_template', $data);
	}
	
	/**
	 * 消息模板详情编辑提交 - 编辑完后的信息提交 - 增加 & 修改
	 *
	 * @desc    编辑完后的信息提交 - 增加 & 修改
	 * @method  POST
	 * @author  Jason
	 * @date	2017年7月21日 下午5:23:44
	 *
	 * @param   number $id		 ID，默认为 0，代表增加 & 非0代表修改
	 * ...
	 *
	 * @return  JSON	标准JSON格式响应
	 * 					结构：无
	 *
	 * @link    /manage/message/ajax_create_template
	 * 
	 * @command noneurl
	 */
	public function ajax_create_template()
	{
		if (empty($id = $this->input->post('id'))) {
			list($status, $content) = $this->lib_message->create('template');
		} else {
			list($status, $content) = $this->lib_message->update('template');
		}
		
		if(!$status) {
			$messageContent = Lib_json::getMessageContent($content);
			Lib_json::renderError(Lib_json::ERROR_BUSINESS, current($content), $messageContent);
		} else {
			Lib_json::renderSuccess(['data' => $content], 'success');
		}
	}
	
	
	
	
	
	
	
	/**
	 * 发送消息 - 应该是多Tab页空表单组
	 *
	 * @desc    应该是多Tab页空表单组
	 * @method  GET
	 * @author  Jason
	 * @date	2017年7月21日 下午3:57:42
	 */
	public function send_message()
	{
		$mapper_metrix = $this->config->item('mapper_metrix')['message']['template'];
		$data['content']['mapper_metrix'] = $mapper_metrix;
		
		$this->load->view('manager/message/send', $data);
	}
	
	/**
	 * 发送消息编辑提交 - 待发送的消息编辑完后的信息提交
	 *
	 * @desc    待发送的消息编辑完后的信息提交
	 * @method  POST
	 * @author  Jason
	 * @date	2017年7月21日 下午7:33:26
	 *
	 * @return  JSON	标准JSON格式响应
	 * 					结构：无
	 *
	 * @link    /manage/message/ajax_send_message
	 * 
	 * @command noneurl
	 */
	public function ajax_send_message()
	{
		$_POST['source_id'] = $this->get_logined_member()['id'];
		list($status, $errorMetrix) = $this->lib_message->sendMessagePerform();
		
		if(!$status) {
			foreach ($errorMetrix as &$content) {
				$content = Lib_json::getMessageContent($content);
			}
			unset($content);
			$messageContent = $errorMetrix;
			Lib_json::renderError(Lib_json::ERROR_BUSINESS, 'error', $messageContent);
		} else {
			Lib_json::renderSuccess([], 'success');
		}
	}
	
	
	
	
	
	
	/**
	 * 我发出的消息列表页 - 后端应该用不到！
	 *
	 * @desc    开发过程中的功能测试 - 后端应该用不到！
	 * @author  Jason
	 * @date	2017年7月24日 下午3:03:08
	 * @link    /manage/message/listing_mine
	 */
	public function listing_mine($page = 1, $number = 20)
	{
		$conditions = $this->lib_message->get_conditions();
		$list = $this->lib_message->get_messages_for_list($conditions, $page, $number);
		$data['list'] = $list;
		
		$this->load->view('manager/message/list_mine', $data);
	}
	
	/**
	 * 我收到的消息列表页 - 后端应该用不到！
	 *
	 * @desc    开发过程中的功能测试 - 后端应该用不到！
	 * @author  Jason
	 * @date	2017年7月24日 下午3:03:08
	 * @link    /manage/message/listing_container_mine
	 */
	public function listing_container_mine($page = 1, $number = 20, $target_id = null)
	{
		$target_id = $target_id ?: $this->get_logined_member()['id'];
		$this->lib_message->receive_new_messages($target_id);
		$this->lib_message->receive_new_messages($target_id, 'APP');
		$conditions = $this->lib_message->get_conditions();
		$conditions[] = ['where', "target_id=$target_id"];
		$list = $this->lib_message->get_containers_for_list($conditions, $page, $number);
		$data['list'] = $list;
		
		$this->load->view('manager/message/list_mine', $data);
	}
	
	
	/**
	 * 消息状态切换 - 后端更应该用不到！
	 *
	 * @desc	消息状态切换，可以切换消息的各种状态！
	 * @method	POST
	 * @author	Jason
	 * @date	2017年7月24日 下午3:39:59
	 *
	 * @param	number $id	消息ID
	 * @param	string $tag	消息正向标签，已读(read)、未删/保留(retained)
	 * 
	 * @param	string $mapping	超级管理员专用参数！
	 *
	 * @return	JSON	标准JSON格式响应
	 *
	 * @link	/manager/message/ajax_toggle_status
	 *
	 * @command noneurl
	 */
	public function ajax_toggle_status()
	{
		$mapping = $this->input->post('mapping');
		list($status, $content) = $this->lib_message->toggle_status_positive_tag($mapping);
		
		if(!$status) {
			Lib_json::renderError(Lib_json::ERROR_BUSINESS, current($content));
		} else {
			Lib_json::renderSuccess(['data' => $content]);
		}
	}
	
	/**
	 * 千万数量级 造数据
	 * 
	 * @desc	按时冲刷，另有两个问题需要解决：阻塞、超载！
	 * 
	 * @command  
	 */
	public function tens_of_thousands()
	{
		function disable_gzip() {
			@ini_set('zlib.output_compression', 'Off');
			@ini_set('output_buffering', 'Off');
			@ini_set('output_handler', '');
			#@apache_setenv('no-gzip', 1);
			// https://stackoverflow.com/questions/41086260/how-can-i-disable-nginx-gzip-from-php
			@ini_set('zlib.output_compression', 'Off');
			@ini_set('implicit_flush', 1);
			header('X-Accel-Buffering: no');
			header("Content-Encoding: identity");
			
		}
		disable_gzip();
// 		#header("Content-Type: text/plain");
// 		for ($i=10; $i>2; $i--)
// 		{
// 			echo $i.'<br />';
// 			ob_flush(); //此句不能少
// 			flush();
// 			sleep(1);
// 		}
// 		ob_end_flush();exit;
		#header("Content-Type: text/plain");
		header("Content-Type: text/html");
		set_time_limit ( 0 );
		
		session_write_close();
		
		// MARK DONE FIXED
		// TODO FIXME Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 88 bytes) in /home/bm/web/discovery.segway/code/system/database/drivers/mysqli/mysqli_result.php on line 168
		// $this->mod_message->db->cache_off(); $this->db->cache_off(); $this->db->flush_cache();
		#$this->db->initialize();
		$this->db->save_queries = $save_queries = FALSE;
		
		$this->load->model('mod_message');
		$last_id = $this->mod_message->db->select_max('target_id', 'last_id')->get('message_container')->row_object()->last_id;
		$last_id = $last_id ? : 1; // 从 1 开始
		$beginning = microtime(true);
		#ob_start();
		// 单人499，10,000,000 ÷ 499 ≈= 20,000 + 40
		for ($target_id = $last_id; $target_id < 20040; $target_id ++) {
			static $rank_start, $rand_stop;
			$rank_start = microtime(true);
			$this->lib_message->receive_new_messages($target_id);
			$this->lib_message->receive_new_messages($target_id, 'APP');
			$rand_stop = microtime(true);
			printf("%6.4f".nl2br(PHP_EOL), $rand_stop - $rank_start);
			// void ob_flush ( void )
			// void flush ( void )
			// $target_id % 2 == 0 && ob_flush() || flush();
			if ($target_id % 5 == 0) {
				ob_flush();
				flush();
				//usleep(200000);
			}
		}
		ob_end_flush();
		$end = microtime(true);
		printf("Total: %6.4f\n", $end - $beginning);
	}
	
}



